home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / 80x0992d.zip / VGAMODEX.ASM < prev    next >
Assembly Source File  |  1992-09-30  |  8KB  |  275 lines

  1. ;VGA non-standard 256 color routines
  2. ;By Matt Pritchard
  3. :Placed in public domain
  4. ;With Input from Michael Abrash
  5. ;MASM v5.10a used for this
  6.  
  7.         .MODEL Medium
  8.  
  9.         VGA_SEGMENT     EQU  0A000H     ;Vga Memory Segment
  10.         SCREEN_XWIDTH   EQU  360        ;Width of screen in Pixels
  11.         SCREEN_WIDTH    EQU  90         ;Width of screen in bytes
  12.         SCREEN_HEIGHT   EQU  240        ;Height of screen
  13.  
  14.         GC_INDEX        EQU  03CEH      ;VGA Graphics Controller
  15.         SC_INDEX        EQU  03C4H      ;VGA Sequence controller
  16.         CRTC_INDEX      EQU  03D4H      ;VGA CRT Controller
  17.         MISC_OUTPUT     EQU  03C2H      ;VGA Misc Register
  18.         MAP_MASK        EQU  02         ;Map Register #
  19.         READ_MAP        EQU  04         ;Read Map Register #
  20.  
  21.         FALSE   EQU     0               ;Boolean false constant
  22.         TRUE    EQU     -1              ;boolean true constant
  23.  
  24.         .DATA
  25.  
  26.         .CODE
  27.  
  28.         ;360 x 240 VGA Mode data
  29.  
  30.  
  31. VMODE_DATA
  32.         DW      06B00H          ; Horz total
  33.         DW      05901H          ; Horz Displayed
  34.         DW      05A02H          ; Start Horz Blanking
  35.         DW      08E03H          ; End Horz Blanking
  36.         DW      05E04H          ; Start H Sync
  37.         DW      08A05H          ; End H Sync
  38.         DW      00D06H          ; Vertical Total
  39.         DW      03E07H          ; Overflow
  40.         DW      04109H          ; Cell Heigth
  41.         DW      0EA10H          ; V Sync Start
  42.         DW      0AC11H          ; V Sync End/Prot Cr0 Cr7
  43.         DW      0DF12H          ; Vertical Displayed
  44.         DW      02D13H          ; Offset
  45.         DW      00014H          ; Dword Mode off
  46.         DW      0E715H          ; V Blank Start
  47.         DW      00616H          ; V Blank End
  48.         DW      0E317H          ; turn on Byte Mode
  49.  
  50. ; Routine: SET_VGA_MODE
  51. ;  Sets up Super high VGA 256 Color RES mode (360 x 240) 
  52. ; BASIC: DECLARE SUB SET.VGA.MODEX ALIAS "SET_VGA_MODE" 
  53. ; C: void SET_VGA_MODE ();
  54. ;
  55.  
  56.     PUBLIC      SET_VGA_MODE
  57.  
  58. SET_VGA_MODE    PROC    FAR
  59.  
  60.     PUSH    BP          ;Save Registers
  61.     PUSH    DS
  62.     PUSH    SI
  63.     PUSH    DI
  64.  
  65.     MOV     AX, 13H             ; Start with Mode 13H
  66.     INT     10H                 ; Let BIOS Set Mode
  67.  
  68.     MOV     DX, SC_INDEX        ; Sequencer Addr
  69.     MOV     AX, 0604H           ; Disable Chain 4 Mode
  70.     OUT     DX, AX
  71.  
  72.     MOV     AX, 0100H           ; (A)synchronous Reset
  73.     OUT     DX, AX
  74.  
  75.     MOV     DX, MISC_OUTPUT     ; VGA Misc Register
  76.     MOV     AL, 0E7H            ; Use 28Mhz Clock & 60Hz
  77.     OUT     DX, AL
  78.  
  79.     MOV     DX, SC_INDEX        ; VGA Sequencer Regs
  80.     MOV     AX, 0300H           ; Restart Sequencer...
  81.     OUT     DX, AX
  82.  
  83.     MOV     DX, CRTC_INDEX      ; Vga crtc Registers
  84.     MOV     AL, 11H             ; cr11
  85.     OUT     DX, AL              ; Load Current Value
  86.     INC     DX                  ; Point to Data
  87.     IN      AL, DX              ; Get CR11
  88.     AND     AL, 7FH             ; Mask out Write Protect
  89.     OUT     DX, AL              ; And send it back
  90.  
  91.     MOV     DX, CRTC_INDEX      ; Vga Crtc Registers
  92.     CLD                         ; Forward Block Load
  93.     MOV     SI, OFFSET VMODE_DATA       ; Get Parameter Data
  94.     MOV     CX, 17              ; Number of Data Entries
  95.  
  96. SV3_CPY:
  97.     MOV     AX,CS:[SI]          ; Get Data from Code Segment
  98.     INC     SI                  ; Advance to next word
  99.     INC     SI
  100.     OUT     DX, AX              ; Send to VGA
  101.     LOOP    SV3_CPY             ; Copy all data...
  102.  
  103.     ;Clear all VGA memory to black
  104.  
  105.     MOV     DX, SC_INDEX        ; Select All Planes
  106.     MOV     AX, 0F02H
  107.     OUT     DX, AX
  108.  
  109.     MOV     AX, VGA_SEGMENT     ; Point to VGA memory
  110.     MOV     ES, AX
  111.     MOV     DI, 000
  112.  
  113.     XOR     AX, AX              ; Clear 256K...
  114.     MOV     CX, 8000H           ; (32K * 2 * 4 planes)
  115.     REP     STOSW
  116.  
  117.     POP     DI                  ; Restore registers
  118.     POP     SI
  119.     POP     DS
  120.     POP     BP
  121.  
  122.     RET                         ;We Done.. Outa here
  123.  
  124. SET_VGA_MODE    ENDP
  125.  
  126. ; Routine: CLEAR_VGA_SCREEN (*Color%)
  127. ;  Sets the Entire Screen to one Color
  128. ;
  129. ; BASIC: DECLARE SUB CLEAR.VGA ALIAS "CLEAR_VGA_SCREEN" _ 
  130. ;        (BYVAL ColorNum%) 
  131. ; C: pascal void CLEAR_VGA_SCREEN (int Color_Num); 
  132. ;
  133.  
  134. CVS_STACK STRUC
  135.                 DW      ?       ;saved DI
  136.                 DW      ?       ;saved BP
  137.                 DD      ?       ;Caller
  138.     CVS_COLOR   DB      ?,?     ;Color to Fill With CVS_STACK ENDS
  139.  
  140.     PUBLIC      CLEAR_VGA_SCREEN
  141.  
  142. CLEAR_VGA_SCREEN        PROC    FAR
  143.  
  144.     PUSH    BP                  ; Save registers
  145.     PUSH    DI
  146.  
  147.     MOV     BP,SP               ; Setup Stack frame
  148.  
  149.     MOV     DX, SC_INDEX        ; Select All Panes
  150.     MOV     AX, 0F02H           ; Map Mask (02) = 0F
  151.     OUT     DX, AX
  152.  
  153.     MOV     AX, VGA_SEGMENT     ; Point to VGA memory
  154.     MOV     ES, AX
  155.     MOV     DI, 0
  156.  
  157.     MOV     AL,[BP].CVS_COLOR   ; Get Color to set
  158.     MOV     AH,AL               ; Copy for Word Write
  159.  
  160.     MOV     CX, 10800           ; # of bytes in 360x240 mode
  161.     REP     STOSW               ; Blast it!
  162.  
  163.     POP     DI                  ; restore registers
  164.     POP     BP
  165.  
  166.     RET     2                   ; exit & clean up stack
  167.  
  168. CLEAR_VGA_SCREEN        ENDP
  169.  
  170. ; Routine: SETPOINT (*Xpos1, *Ypos1%, *ColorNum%) 
  171. ;   Sets a single pixel in 360x240 256 color mode 
  172. ; BASIC: DECLARE SUB SETPOINT (BYVAL X%, BYVAL Y%, BYVAL ColorNum%) 
  173. ; C: pascal void SETPOINT (int Xpos, int Ypos, int Color_num);
  174. ;
  175.  
  176. SP_STACK STRUC
  177.                 DW      ?       ;saved BP
  178.                 DD      ?       ;Caller
  179.     SETP_COLOR  DB      ?,?     ;Pixel color
  180.     SETP_YPOS   DW      ?       ;Pixel Y pos
  181.     SETP_XPOS   DW      ?       ;Pixel X pos SP_STACK ENDS
  182.  
  183.     PUBLIC SETPOINT
  184.  
  185. SETPOINT    PROC    FAR
  186.  
  187.     PUSH    BP                  ;Save base pointer
  188.  
  189.     MOV     BP,SP               ;Set up stack frame
  190.  
  191.     MOV     AX, SCREEN_WIDTH    ;Get Screen Line Width
  192.     MUL     [BP].SETP_YPOS      ;AX = Ypos * 90
  193.  
  194.     MOV     BX,[BP].SETP_XPOS   ;Get Xpos
  195.     MOV     CX, BX              ;Save copy of Xpos
  196.     SHR     BX, 1               ;XByte = Xpos/4
  197.     SHR     BX, 1
  198.  
  199.     ADD     BX,AX               ;BX = 90 * Ypos + Xpos/4
  200.  
  201.     MOV     AX, 0102h           ;Plane Mask & Select Register
  202.     AND     CL, 3               ;Get plane # from Xpos
  203.     SHL     AH, CL              ;Shift to Get Plane Value
  204.     MOV     DX, SC_INDEX        ;Setup to select plane
  205.  
  206.     OUT     DX, AX              ;Select Plane...
  207.  
  208.     MOV     AX,VGA_SEGMENT      ;Setup Vga Segment
  209.     MOV     ES,AX
  210.  
  211.     MOV     AL,[BP].SETP_COLOR  ;Get Color
  212.  
  213.     MOV     ES:[BX], AL         ;Draw Point
  214.  
  215.     POP     BP                  ;Restore Bp
  216.  
  217.     RET     6                   ;Exit and Clean up Stack
  218.  
  219. SETPOINT    ENDP
  220.  
  221. ; Routine: int READPOINT (*Xpos, *Ypos%)
  222. ;    Returns the color of single pixel in AX 
  223. ; BASIC: DECLARE FUNCTION READPOINT% (BYVAL X%, BYVAL Y%) 
  224. ; C: pascal void READPOINT (int Xpos, int Ypos);
  225. ;
  226.  
  227. RP_STACK STRUC
  228.                 DW      ?       ;saved Bp
  229.                 DD      ?       ;Caller
  230.     RP_YPOS     DW      ?       ;Pixel Y pos
  231.     RP_XPOS     DW      ?       ;Pixel X pos RP_STACK ENDS
  232.  
  233.     PUBLIC      READPOINT
  234.  
  235. READPOINT        PROC    FAR
  236.  
  237.     PUSH    BP
  238.  
  239.     MOV     BP,SP               ;Set up stack frame
  240.  
  241.     MOV     AX, SCREEN_WIDTH    ;Get Screen Line Width
  242.     MUL     [BP].RP_YPOS        ;AX = Ypos * Screen Width
  243.  
  244.     MOV     BX,[BP].RP_XPOS     ;Get Xpos
  245.     MOV     CX, BX              ;Save Copy of Xpos
  246.     SHR     BX, 1               ;XByte = Xpos/4
  247.     SHR     BX, 1
  248.  
  249.     ADD     BX,AX               ;BX = Screen_Width * Ypos + Xpos/4
  250.  
  251.     MOV     AL, READ_MAP        ;GC Read Mask Register
  252.     MOV     AH, CL              ;Get Xpos
  253.     AND     AH, 3               ;& mask out Plane #
  254.     MOV     DX, GC_INDEX        ;Setup to select Read Mask
  255.  
  256.     OUT     DX, AX              ;Select Plane...
  257.  
  258.     MOV     AX,VGA_SEGMENT      ;Setup Vga Segment
  259.     MOV     ES,AX
  260.  
  261.     XOR     AX,AX               ;Clear Return Value
  262.  
  263.     MOV     AL,ES:[BX]          ;Get Color of Pixel
  264.  
  265.     POP     BP                  ;Restore registers
  266.  
  267.     RET     4                   ;Exit and Clean up Stack
  268.  
  269. READPOINT        ENDP
  270.  
  271. ; EOF VGAMODEX.ASM
  272.